<?php
    include_once 'ilogin.php';
    abstract class Login implements ILogin{
        private $usuario;   //atributos privados
        private $senha;
        public static $nro_usuarios_online = 0;
        
        //Login tem a opção de implementar o método imprimir_dados ou deixar que 
        //as subclasses dela o implemente.
        abstract protected function logar();
        
        // deixa que as subclasses dela 
        //o implemente(deixando abstract)
        //public abstract function imprimir_dados(Usuario $u);  
                                                                    
        //Também é um exemplo de polimorfismo!
        public function imprimir_dados(Login $l){ //implementando o método da interface ILogin
            echo "Classe usuário: ".get_class($l)."<br>";
        }

        function __construct($usuario, $senha) {//método construtor
            $this->usuario = $usuario;
            $this->senha = $senha;
            Login::alteraNroUsuariosOnline(+1);//ou self::alteraNroUsuariosOnline(+1);
        }
        
        function __destruct() {//método construtor            
            Login::alteraNroUsuariosOnline(-1);//ou self::alteraNroUsuariosOnline(-1);
        }
        
        static function alteraNroUsuariosOnline($add_or_remove=0){
            Login::$nro_usuarios_online += $add_or_remove;
            echo "Usuarios OnLine: ". Login::$nro_usuarios_online."<br>";
        }
        
        //GETTERS and SETTERS. 
        //$this é uma pseudo variável que referencia o objeto chamador do método
        public function getUsuario() {
            return $this->usuario;
        }

        public function setUsuario($usuario) {
            $this->usuario = $usuario;
        }

        public function getSenha() {
            return $this->senha;
        }

        public function setSenha($senha) {
            $this->senha = $senha;
        }
    }
?>
